{
		BARAJ Clasa a XI a

1. Doua orase A si B au acelasi numar de magazine si depozite, n, respectiv m
(1<=n<=10,0<=m<=10), numerotate de la 1 la n si de la n+1 la n+m. 
Harta strazilor care leaga obiective de tipul magazine sau depozite este 
cunoscuta. 
Datele de intrare se citesc dintr-un fisier text avind formatul
n m
pe prima linie si apoi 2x(n+m) linii care contin cate n+m valori 1 sau 0. 
1 la coordonatele i si j daca intre obiectivele acestea exista o strada si 
0 in caz contrar.
a. Sa se determine pentru fiecare oras, cu datele citite din fisierul
NUME.IN1, toate perechile (i,j), i<j, de magazine pentru care nu exista nici 
un drum care sa le lege si care sa contina cel putin un depozit. 
Rezultatele sunt scrise in NUME.O1 sub forma
A
i j
...
B
i j
... 
b. Sa se determine pentru fiecare oras, cu datele citite din NUME.IN2,
toate perechile (i,j), i<j, de depozite care sunt legate prin drumuri continind 
strazi care trec numai prin depozite, precizind cite un astfel de drum. 
Rezultatele sunt scrise in NUME.O2 sub forma
A
i j i_1 ... i_p       unde i_1 ... i_p este drum de la i la j, i=i_1 si j=i_p
...
B
i j i_1 ... i_p       unde i_1 ... i_p este drum de la i la j, i=i_1 si j=i_p
...
c. Sa se transforme harta orasului A astfel incit sa fie obtinuta cea a 
orasului B (daca este posibil), prin urmatoarele operatii:
  (i)  adaugarea unei strazi intre doua obiective daca acestea sunt
legate printr-un drum de lungime mai mare ca 1;
  (ii) eliminarea unei strazi avind extremitatile doua obiective legate 
printr-un drum de lungime mai mare ca 1.
Datele de intrare se citesc din fisierul text NUME.IN3, iar rezultatele
se scriu in NUME.O3 ca succesiuni de linii
ADAUGA i j 
sau 
ELIMINA i j 
unde i<j;  sau se scrie
TRANSFORMARE IMPOSIBILA 
daca punctul c nu are solutie.
Fiecare dintre cele 3 cerinte se noteaza cu cate 10 puncte.

2. Se considera un limbaj cu instructiuni de atribuire. Fiecare instructiune
asigneaza unei variabile o expresie formata din variabile, constante numerice
si operatori aritmetici; parantezele sunt permise. Fiecare instructiune se
termina cu ";". Urmatoarele reguli sintactice definesc constructiile corecte
ale limbajului:
1. <program> ::=
	<corp_program> <end_of_file>
2. <corp_program> ::=
	<atribuire> <corp_program> | <atribuire>
3. <atribuire> ::=
	<variabila>":="<expresie>";"
4. <expresie> ::=
	<variabila> | <constanta> | 
	<expresie><operator><expresie> |
	"("<expresie>")"
5. <variabila> ::=
	<litera> | <variabila><litera>
6. <constanta> ::=
	<cifra> | <constanta><cifra>
7. <cifra> ::=
	"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
8. <litera> ::=
	"A" | "B" | "C" | "D" | "E"
9.<operator> ::=
	"+" | "-" | "*" | "/"

Lungimea numelor de variabile, a constantelor si nivelul de imbricare al
parantezelor nu sunt limitate de specificare.
Pentru un program scris pe o singura linie in fisierul de intrare PROG.IN, 
scrieti un verificator de sintaxa care sa stabileasca daca programul este 
corect sau nu.
In fisierul PROG.OUT este scris mesajul
PROGRAM CORECT		- daca programul este corect sau
PROGRAM INCORECT	- daca programul nu este corect, iar pe urmatoarele 
			linii instructiunea(ile) de asignare care este (sunt) 
			eronata(e) urmate de numarul primei reguli, intre 1 si 9, 
			care nu este satisfacuta.
Problema se noteaza cu 20 de puncte.
Timp de lucru 3 ore.
}